package xyz.heyaoshare.utils;

import cn.hutool.core.date.DateUtil;
import lombok.AllArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.TemporalAdjusters;

/**
 * 时间工具类【基于hu-tool】
 * @author YueHe
 * @version 0.0.1
 * @since 2025/6/25 上午10:44
 */
public class DateUtils extends DateUtil {

    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    public static final String YYYY_MM_DD = "yyyy-MM-dd";
    public static final String TIME_ZONE = "GMT+8";

    /**
     * 在当前日期上加上指定的天数，并返回加上天数后的日期当天的结束时间（23:59:59）的 LocalDateTime 对象。
     *
     * @param days 要加的天数
     * @return 加上指定天数后的日期当天的结束时间（23:59:59）的 LocalDateTime 对象
     */
    public static LocalDateTime addDaysToCurrentDateWithEndTime(int days) {
        // 获取当前日期的 LocalDate
        LocalDate currentDate = LocalDate.now();
        // 在当前日期上加上指定的天数
        LocalDate resultDate = currentDate.plusDays(days);
        // 将日期与时间 23:59:59 组合为 LocalDateTime
        return LocalDateTime.of(resultDate, LocalTime.of(23, 59, 59));
    }

    /**
     * 在给定的 LocalDateTime 上添加指定天数，并将结果时间的分钟和秒设为23:59:59。
     *
     * @param localDateTime 要添加天数的 LocalDateTime 对象
     * @param days          要添加的天数
     * @return 新的 LocalDateTime 对象，其日期为原日期加上指定天数，时间设为23:59:59
     */
    public static LocalDateTime addDaysWithEndTime(LocalDateTime localDateTime, int days) {
        // 在当前日期上加上指定的天数
        LocalDate resultDate = localDateTime.toLocalDate().plusDays(days);
        // 将日期与时间 23:59:59 组合为 LocalDateTime
        return LocalDateTime.of(resultDate, LocalTime.of(23, 59, 59));
    }


    /**
     * 获取当前月的最后一天，并将时间设置为 23:59:59
     * @return 当前月的最后一天的 LocalDateTime，时间设置为 23:59:59
     */
    public static LocalDateTime getLastDayOfMonthWithEndTime() {
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        // 获取当前月的最后一天
        LocalDate lastDayOfMonth = currentDate.with(TemporalAdjusters.lastDayOfMonth());
        // 将日期与时间 23:59:59 组合为 LocalDateTime
        return LocalDateTime.of(lastDayOfMonth, LocalTime.of(23, 59, 59));
    }

    /**
     * 将给定的 LocalDateTime 截断到天边界。
     *
     * @param dateTime 需要截断的 LocalDateTime 对象
     * @param time 截断的时间类型，如果是 {@link TIME#UP}，则截断到当天零点；如果是 {@link TIME#DOWN}，则截断到当天23点59分59秒
     * @return 截断后的 LocalDateTime 对象
     */
    public static LocalDateTime truncateDateTimeToDayBoundary(LocalDateTime dateTime, TIME time) {
        dateTime = dateTime == null ? LocalDateTime.now() : dateTime;
        if (time == TIME.UP) {
            return dateTime.withHour(0).withMinute(0).withSecond(0);
        }
        return dateTime.withHour(23).withMinute(59).withSecond(59);
    }

    @AllArgsConstructor
    public enum TIME {
        UP, //表示一天的开始，即 00:00:00
        DOWN // 表示一天的结束，即 23:59:59
    }

}
